import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import mplfinance as mpf
from matplotlib.font_manager import FontProperties
import matplotlib

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 读取Excel文件
file_path = 'c:\\Users\\YEDX\\Downloads\\比亚迪后复权历史行情数据.xlsx'
print(f"正在读取文件: {file_path}")

try:
    # 使用pandas读取Excel文件
    df = pd.read_excel(file_path)
    
    # 确保日期列是日期类型
    if '日期' in df.columns:
        df['日期'] = pd.to_datetime(df['日期'])
        df = df.sort_values('日期')
        df.set_index('日期', inplace=True)
    
    print("\n=== 数据基本信息 ===")
    print(f"数据形状: {df.shape}")
    print(f"行数: {df.shape[0]}")
    print(f"列数: {df.shape[1]}")
    
    print("\n=== 列名信息 ===")
    print(df.columns.tolist())
    
    print("\n=== 数据前5行 ===")
    print(df.head())
    
    # 1. 计算相关系数并绘制热力图
    print("\n=== 相关系数分析 ===")
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    corr_matrix = df[numeric_cols].corr()
    print("\n相关系数矩阵:")
    print(corr_matrix.round(4))
    
    # 绘制相关系数热力图
    plt.figure(figsize=(12, 10))
    sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1, fmt='.3f', 
                linewidths=0.5, square=True, cbar_kws={'shrink': 0.8})
    plt.title('变量相关系数热力图', fontsize=16)
    plt.xticks(rotation=45, ha='right')
    plt.yticks(rotation=0)
    plt.tight_layout()
    plt.savefig('相关系数热力图.png', dpi=300, bbox_inches='tight')
    print("\n相关系数热力图已保存为: 相关系数热力图.png")
    
    # 2. 绘制2023年全年收盘价时序图
    print("\n=== 绘制收盘价时序图 ===")
    plt.figure(figsize=(14, 7))
    plt.plot(df.index, df['收盘'], 'b-', linewidth=2, label='收盘价')
    plt.title('比亚迪2023年收盘价时序图', fontsize=16)
    plt.xlabel('日期', fontsize=12)
    plt.ylabel('收盘价(元)', fontsize=12)
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.legend(fontsize=12)
    plt.tight_layout()
    plt.savefig('收盘价时序图.png', dpi=300, bbox_inches='tight')
    print("收盘价时序图已保存为: 收盘价时序图.png")
    
    # 3. 绘制2023年4月到6月的K线图
    print("\n=== 绘制K线图(2023年4月-6月) ===")
    # 选择4月到6月的数据
    k_data = df['2023-04-01':'2023-06-30'].copy()
    
    # 确保列名符合mplfinance要求
    k_data_mpf = k_data.rename(columns={'开盘': 'Open', '最高': 'High', '最低': 'Low', '收盘': 'Close', '成交量': 'Volume'})
    
    # 绘制K线图
    mpf_style = mpf.make_mpf_style(base_mpf_style='charles', rc={'font.family': ['SimHei', 'Microsoft YaHei']})
    fig, axes = mpf.plot(k_data_mpf, type='candle', style=mpf_style, 
                        title='比亚迪2023年4-6月K线图', 
                        ylabel='价格(元)', 
                        volume=True, 
                        ylabel_lower='成交量', 
                        figsize=(16, 10), 
                        returnfig=True, 
                        show_nontrading=False)
    
    # 保存K线图
    plt.tight_layout()
    fig.savefig('K线图_2023年4-6月.png', dpi=300, bbox_inches='tight')
    print("K线图已保存为: K线图_2023年4-6月.png")
    
    # 4. K线图分析
    print("\n=== K线图分析(2023年4-6月) ===")
    # 计算基本统计
    apr_jun_data = k_data_mpf
    price_change = (apr_jun_data['Close'][-1] - apr_jun_data['Close'][0]) / apr_jun_data['Close'][0] * 100
    max_price = apr_jun_data['High'].max()
    min_price = apr_jun_data['Low'].min()
    avg_volume = apr_jun_data['Volume'].mean()
    
    print(f"起始价: {apr_jun_data['Close'][0]:.2f}元")
    print(f"结束价: {apr_jun_data['Close'][-1]:.2f}元")
    print(f"区间涨跌幅: {price_change:.2f}%")
    print(f"最高价: {max_price:.2f}元")
    print(f"最低价: {min_price:.2f}元")
    print(f"价格区间: {max_price - min_price:.2f}元")
    print(f"平均成交量: {avg_volume/10000:.2f}万股")
    
    # 趋势分析
    if price_change > 5:
        trend = "明显上涨"
    elif price_change < -5:
        trend = "明显下跌"
    elif price_change > 0:
        trend = "小幅上涨"
    elif price_change < 0:
        trend = "小幅下跌"
    else:
        trend = "基本持平"
    
    volatility = (max_price - min_price) / apr_jun_data['Close'].mean() * 100
    if volatility > 15:
        vol_level = "高波动"
    elif volatility < 8:
        vol_level = "低波动"
    else:
        vol_level = "中等波动"
    
    print(f"\n趋势判断: {trend}")
    print(f"波动水平: {vol_level} (波动率: {volatility:.2f}%)")
    
    # 支撑位和阻力位简单分析
    print(f"\n关键价位:")
    print(f"  可能的阻力位: {max_price:.2f}元")
    print(f"  可能的支撑位: {min_price:.2f}元")
    print(f"  中期均价: {apr_jun_data['Close'].mean():.2f}元")
    
    print("\n分析完成! 图表已保存为PNG文件。")
    
except Exception as e:
    print(f"处理数据时出错: {e}")
    import traceback
    traceback.print_exc()